package com.lopo.test;
import java.util.function.Predicate;

/*
1.8 常用函数式接口之Predicate

    Predicate<T>接口通常用于判断参数是否满足指定的条件

    boolean test(T t) 对给定的参数进行判断(判断逻辑由Lambda表达式实现)，返回一个布尔值
    default Predicate negate() 返回一个逻辑的否定，对应逻辑非
    default Predicate and(Predicate other)返回一个组合判断，对应短路与
    default Predicate or(Predicate other) 返回一个组合判断，对应短路或
 */
public class Demo8Predicate {
    public static void main(String[] args) {
        boolean b1 = checkString("hello", s -> s.length() > 8);
        System.out.println(b1);  // #1:false #2:true #3:true
        boolean b2 = checkString("helloworld", s -> s.length() > 8);
        System.out.println(b2);  // #1:true #2:false #3:false

        System.out.println("==================================");

        boolean b3 = checkString("hello", s -> s.length() > 8, s -> s.length() < 15);
        System.out.println(b3);  // &&and:false  ||or:true
        boolean b4 = checkString("helloworld", s -> s.length() > 8, s -> s.length() < 15);
        System.out.println(b4);  // &&and:true  ||or:true
    }

    // 判断给定字符串是否满足要求
    private static boolean checkString(String str, Predicate<String> pre) {
        //        return pre.test(str);  // #1
        //        return !pre.test(str);  // #2  取反
        return pre.negate().test(str);  // #3  效果同#2，这是逻辑非官方写法
    }

    // 同一个字符串给出两个不同的判断条件，最后把这两个判断的结果做逻辑与运算的结果作为最终的结果
    private static boolean checkString(String str, Predicate<String> pre1, Predicate<String> pre2) {
         /*boolean b1 = pre1.test(str);
         boolean b2 = pre2.test(str);
         boolean b = b1 && b2;  // 短路逻辑与
         return b;*/
        //        return pre1.and(pre2).test(str);  // 效果同上

         /*boolean b1 = pre1.test(str);
         boolean b2 = pre2.test(str);
         boolean b = b1 || b2;  // 短路逻辑或
         return b;*/
        return pre1.or(pre2).test(str);   // 效果同上
    }
}